const s1 = "hello";
console.log([...s1]); // [ 'h', 'e', 'l', 'l', 'o' ]
console.log(new Array()); // []
console.log(new Array(3)); // [ <3 empty items> ]
console.log(new Array(3, 1)); // [ 3, 1 ]
console.log(Array.of(3)); // [ 3 ]
console.log(Array.of(3, 1)); // [ 3, 1 ]

function* foo(i) {
  let j = 0;
  while (j < i) {
    yield j;
    j++;
  }
}
// Array.from 期待一个可迭代对象或类数组对象作为其第一个参数，并返回包含该对象元素的新数组
console.log(Array.from(foo(3))); // [ 0, 1, 2 ]
// 如果传入可迭代对象，Array.from(iterable) 与使用扩展操作符 [...iterable] 一样，因此，
// 它也是创建数组副本的一种简单方式
console.log([...foo(3)]); // [ 0, 1, 2 ]
// Array.from 也接受可选的第二个参数作为转换函数(类似 map 参数)，效率比先构建数组再map的效率要高
console.log(Array.from(foo(3), (v) => v * 2)); // [ 0, 2, 4 ]
